/*
 * @lc app=leetcode.cn id=387 lang=javascript
 *
 * [387] 字符串中的第一个唯一字符
 */

// @lc code=start
/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function(s) {
    let frequencyObj = new StringFrequency(s)
    let oneArr = frequencyObj.charArr.filter(e => e.frequency === 1)
    if (oneArr[0]) {
        return oneArr[0].firstIndex
    }
    return -1
};

// 获取字符串中字符频率等信息
/**
 * @param {string} s
 * @return
 */
function StringFrequency(s) {
    this.charObj = {}
    this.charArr = []
    let stringIndex = 0
    for (let index = 0; index < s.length; index++) {
        const nowChar = s[index];
        if (this.charObj[nowChar]) {
            this.charObj[nowChar].frequency++
            this.charArr[this.charObj[nowChar].index].frequency++
        } else {
            this.charObj[nowChar] = {
                frequency: 1, // 出现频率
                index: stringIndex, // 字符串中第几个不一样的字符串
                firstIndex: index // 第一次出现索引
            }
            this.charArr.push({
                value: nowChar, // 字符
                frequency: 1, // 出现频率
                firstIndex: index // 第一次出现索引
            })
            stringIndex++
        }
    }
}
// @lc code=end

